#include"fileops.h"
int cd_command( char *cwd, const char *input_path,const char*root_dir) {
    DirStack stack;
    char result_path[100];
    init_stack(&stack);

    // 如果是绝对路径，清空栈准备从根开始
    int i = 0;
    if (input_path[0] == '/') {
        // 绝对路径：什么都不压，栈空表示根目录
        i = 1; 
    } else {
        // 相对路径：先把cwd拆成目录压入栈
        const char *start = cwd;
        const char *slash;
        while ((slash = strchr(start, '/')) != NULL) {
            if (slash != start) {
                char dir[MAX_DIR_NAME];
                int len = slash - start;
                if (len > MAX_DIR_NAME - 1) len = MAX_DIR_NAME - 1;
                strncpy(dir, start, len);
                dir[len] = '\0';
                push(&stack, dir);
            }
            start = slash + 1;
        }
        // 最后一个目录名（没有尾部'/')
        if (*start != '\0') {
            push(&stack, start);
        }
        i = 0;
    }

    // 分割input_path的每个目录片段
    while (input_path[i] != '\0') {
        // 跳过连续的 '/'
        while (input_path[i] == '/') i++;
        if (input_path[i] == '\0') break;

        // 找到下一个 '/'
        int j = i;
        while (input_path[j] != '/' && input_path[j] != '\0') j++;

        char part[MAX_DIR_NAME];
        int len = j - i;
        if (len >= MAX_DIR_NAME) len = MAX_DIR_NAME - 1;
        strncpy(part, input_path + i, len);
        part[len] = '\0';

        if (strcmp(part, ".") == 0) {
            // 当前目录，不操作
        } else if (strcmp(part, "..") == 0) {
            // 上一级目录，弹栈
            pop(&stack);
        } else {
            // 普通目录名，压栈
            push(&stack, part);
        }

        i = j;
    }

    // 拼接结果路径
    if (stack.top == -1) {
        // 栈空，表示根目录
        strcpy(cwd, "/");
    } else {
        result_path[0] = '\0';
        for (int k = 0; k <= stack.top; k++) {
            strcat(result_path, "/");
            strcat(result_path, stack.dirs[k]);
        }

    }
    int ret= is_valid_dir(result_path);
    if(ret==-1){
        return -1;
    }else if(ret==-2){
        return -2;
    }
   int kk=is_base(result_path,root_dir);
   if(kk==-1)
   {
       return -3;
   }
   strcpy(cwd,result_path);
  return 0;
}

